from celery import Celery
from celery.schedules import crontab
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'library.settings')
app = Celery('library', broker='redis://localhost:6379/1', backend='redis://localhost:6379/2')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

app.conf.update(
    worker_max_tasks_per_child=1000,
    timezone='Asia/Shanghai',
    enable_utc=False,# 禁用 UTC 时间
    task_acks_late=True,
    broker_pool_limit=None,
    broker_connection_retry_on_startup=True
)
app.conf.beat_schedule = {
    'send-due-date-reminders': {
        'task': 'borrowing.tasks.send_due_date_reminders',
        'schedule': crontab(hour=16, minute=7),  # 每天 08:00 执行
    },
}


"""
第1步:
法1：启动Worker(保持窗口打开)在 Windows 系统上，建议使用 solo 池来替代默认的 prefork 池,
solo池使用单线程模式，避免了多进程在 Windows 上的兼容性问题。你可以在启动 Celery Worker 时通过--pool 参数指定池类型

celery -A borrowing.celery worker --loglevel=info --pool=solo

法2：eventlet 是一个基于协程的并发库，它可以在单线程内实现高并发，避免了多进程在 Windows 上的一些兼容性问题，
同时在性能上也有不错的表现，尤其适合 I/O 密集型任务。

 celery -A borrowing.celery worker --loglevel=info --pool=eventlet


# 第2步:新开终端窗口，启动Beat(保持窗口打开)

 celery -A borrowing.celery beat --loglevel=info   

"""